from first_word_analyse import WordAnalyse

"""

最近在学习编译原理。将源程序转化为可执行程序或者中间代码的过程称为编译。编译的流程如下：

1. 词法分析
2. 语法分析
3. 语义分析
4. 中间代码生成
5. 代码优化

在学习的过程中还引入了许多工具。其中最突出的是下面三个
1. 文法
2. 正规表达式
3. 状态机

接下来创建一种新的语言，名称为 SIMPLE 语言，该语言和C语言相类似，但是简化了很多设计。具体而言如下：

1. 文件后缀为.simple
2. 支持的数据类型为 int，real
3. 能够实现带括号的加减乘运算
4. 提供选择，循环流程控制
5. 提供函数机制

该语言的文法和相关正规表达式如下所示：

variable_declaration ::= <type> <identifier> [= <E>]
variable_declaration ::= <type> <identifier> [= <E>]
type::= int | real
identifier::= <letter> {<letter> | <digit>}
identifier::=<letter> {<letter> | <digit>}, <identifier>
E ::= <E> + <E> | <E> - <E> | <E> * <E> | (<E>) | <digit> | <identifier>
E ::= <E> <rop> <E>
rop ::= and | or | not | < | <= | > | >= | = | !=
function ::= <return_type> <function_name> (<args>){<block>}
return_type ::= int | real | void
block ::= <statement> <block>
block :: return <E> | epsilon
function_name::= <letter> {<letter> | <digit>}
args::= <type> <identifier>
args::= <type> <identifier>, <args>
args::= epsilon
if_statement ::= if (<E>) {<block>} [else {<block>}]
while_statement ::=while (<E>) {<block>}

语言的保留字为：int,real,if,while,else,and,or,not,return

语句后面以分号结尾
为了简化设计，每一行编写一条语句。下面是一个程序示例

simple_0.simple 文件
int a=10;
real b=10.34,c=10.0;

int i=0;
while(i < 10){
    a=a+1;
    i=i+1;
}

int m=a*i+(4+5)*10+8;

int max(int a,int b){
    if(a > b){
        return a;
    }else{
        return b;
    }
}

int d=a+b;
int result=max(a,b)+c;

"""

"""
首先进行词法分析，读取源文件 simple_0.simple，将其转化为一个个的词法单元。
在转化的过程中需要过滤掉换行符，tab制表符以及多余的空格

一行一行读取源文件,删除每一行开始位置和结束位置的空格，换行和制表位字符
读一行源代码，删掉开始位置特殊字符。进行如下词法分析：

"""

file = open('simple_0.simple', 'r')
text = file.read()
file.close()

# with open('simple_0.simple', 'r') as f:
#     text = f.read()

word_analyse = WordAnalyse(text)
word_analyse.word_analyse()
print(word_analyse.get_word_list())
